﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Simulator
{
    /// <summary>
    /// Синхронизатор
    /// </summary>
    [Serializable]
    public class Sync: Block
    {
        public Block Prev2 { get; set; }

        private Entity eR = null;
        /// <summary>
        /// Получить значение bool, ожидает ли сущность свою копию
        /// </summary>
        public Entity EntityForRemove { get { return eR; } }
        private List<Entity> entities = new List<Entity>();
        /// <summary>
        /// При попадании в этот блок сущность начинает ждать свою копию.
        /// </summary>
        /// <param name="e">Сущность</param>
        public override void PutEntity(ref Entity e)
        {
            int ind = e.Index;
            e.OwnerBlock = this;

            //найдем, есть ли в списке сущностей ее копия

            Entity e2 = entities.Find(delegate(Entity et){
                if(et.Index == ind)
                    return true;
                else
                    return false;
            });

            //если содержит сущность - копию
            if(e2!= null)
            {
                if (e2.Quality < e.Quality)
                    e.Quality = e2.Quality;//выберем меньшее качество
                e.TimeRemained = 0;//пусть ждет свой черед в числе первых
            }
            else
            {
                e.TimeRemained = double.MaxValue;//будет ждать до тех пор, пока не найдется ее копия
                entities.Add(e);//добавили сущность в список и сохранили в блоке
            }
        }
        /// <summary>
        /// Если в блоке есть копия этой сущности, она "склеивается" с ней
        /// и передается далее как одна сущность, в противном случае остается в блоке
        /// </summary>
        /// <param name="e"></param>
        public void TransferEntity(ref Entity e)
        {
            int ind = e.Index;
            //найдем, есть ли в списке сущностей ее копия

            Entity e2 = entities.Find(delegate(Entity et)
            {
                if (et.Index == ind)
                    return true;
                else
                    return false;
            });

            eR = e2;//null или кандидат в удаление из глобального списка сущностей в модели
            //если содержит сущность - копию
            if (e2 != null)
            {
                entities.Remove(e2);//удалим сущность из текущего списка
                Next.PutEntity(ref e);//передаем сущность
            }
            else
            {
                //Попадание в эту ветку означает, что мы дошли до не дождавшихся копий сущностей.
                throw new Exception("В блоке синхронизации осталась сущность без копии!");
            }

        }
        public override void ClearEntities()
        {
            entities.Clear();
            eR = null;
        }

    }
}
